﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using OR.Enumerador;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;

namespace Dao
{
    public class EnderecoDao : IEnderecoDao<mEndereco>
    {
        private mEndereco infoEndereco;
      
        public EnderecoDao()
        {
        }

        #region Comando SQL
        const string cmdInsertSQL = @"INSERT INTO cadastro.endereco(indice, empresa, tipologradouro, logradouro, 
                                      numero, bairro, cidade, cep, uf, complemento, tipo)
                                      VALUES (@indice, @empresa, @tipologradouro, @logradouro, 
                                      @numero, @bairro, @cidade, @cep, @uf, @complemento, @tipo) ";

        const string cmdUpdateSQL = @"UPDATE cadastro.endereco SET  tipologradouro=@tipologradouro, 
                                      logradouro=@logradouro, numero=@numero, bairro=@bairro, 
                                      cidade=@cidade, cep=@cep, uf=@uf, complemento=@complemento, tipo=@tipo ";
 
        const string cmdDeleteSQL = @"DELETE FROM cadastro.endereco ";

        const string cmdSelectSQL = @"SELECT indice, empresa, tipologradouro, logradouro, numero, bairro, 
                                      cidade, cep, uf, complemento, tipo FROM cadastro.endereco ";
 
        #endregion
        
        #region Metodos
        bool IEnderecoDao<mEndereco>.Inserir(mEndereco infoEndereco)
        {
            bool sucesso = false;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsertSQL;
                GeraParametro(ref _cmd, infoEndereco, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IEnderecoDao<mEndereco>.Inserir(mEndereco infoEndereco)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IEnderecoDao<mEndereco>.Alterar(mEndereco infoEndereco, int Indice, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdateSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA"; 
                _cmd.CommandText = cmdSQL;
                GeraParametro(ref _cmd, infoEndereco, 2);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IEnderecoDao<mEndereco>.Alterar(mEndereco infoEndereco)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IEnderecoDao<mEndereco>.Excluir(int Indice, short Empresa)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL;

            try
            {

                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdDeleteSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IEnderecoDao<mEndereco>.Excluir(int Indice)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
       
        mEndereco IEnderecoDao<mEndereco>.GetEndereco(int Indice, short Empresa)
        {
            infoEndereco = new mEndereco();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);
                if (rd.Read())
                    infoEndereco = GetRdEndereco(rd);
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mEndereco IEnderecoDao<mEndereco>.GetEndereco(eEntidade Entidade, int CodigoEntidade)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return infoEndereco;
        }

        List<mEndereco> IEnderecoDao<mEndereco>.GetListEndereco(int Indice, short Empresa)
        {
            List<mEndereco> lstEndereco = new List<mEndereco>();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE indice =@PAR_INDICE AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_INDICE";
                p.Value = Indice;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                while (rd.Read())
                {
                    infoEndereco = GetRdEndereco(rd);
                    lstEndereco.Add(infoEndereco);
                }
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "List<mEndereco> IEnderecoDao<mEndereco>.GetListEndereco(eEntidade Entidade, int CodigoEntidade)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return lstEndereco;
        }
        #endregion

        #region Metodos privados
        private mEndereco GetRdEndereco(DbDataReader rd)
        {
            infoEndereco = new mEndereco();

            infoEndereco.Indice = Convert.ToInt32(rd["indice"]);
            infoEndereco.Empresa = Convert.ToInt16(rd["empresa"]);
            infoEndereco.TipoLogradouro = rd["tipologradouro"].ToString();
            infoEndereco.Logradouro = rd["logradouro"].ToString();
            infoEndereco.Numero = rd["numero"].ToString();
            infoEndereco.Bairro = rd["bairro"].ToString();
            infoEndereco.Cidade = rd["cidade"].ToString();
            infoEndereco.Cep = rd["cep"].ToString();
            infoEndereco.UF = rd["uf"].ToString();
            infoEndereco.Complemento = rd["complemento"].ToString();
            infoEndereco.Tipo = (eTipoEndereco)Convert.ToInt32(rd["tipo"]); 

            return infoEndereco;
        }
        private void GeraParametro(ref DbCommand _cmd, mEndereco infoEndereco, byte Acao)
        {
            _cmd.Parameters.Clear();

            if (Acao == 1)
            {
                UtilBD.AdicionaParametro(ref _cmd, "@indice", infoEndereco.Indice);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoEndereco.Empresa);
            }
            UtilBD.AdicionaParametro(ref _cmd, "@tipologradouro", infoEndereco.TipoLogradouro);
            UtilBD.AdicionaParametro(ref _cmd, "@tipo", (int)Enum.Parse(typeof(eTipoEndereco), infoEndereco.Tipo.ToString()));
            UtilBD.AdicionaParametro(ref _cmd, "@logradouro", infoEndereco.Logradouro);
            UtilBD.AdicionaParametro(ref _cmd, "@numero", infoEndereco.Numero);
            UtilBD.AdicionaParametro(ref _cmd, "@bairro", infoEndereco.Bairro);
            UtilBD.AdicionaParametro(ref _cmd, "@cidade", infoEndereco.Cidade);
            UtilBD.AdicionaParametro(ref _cmd, "@cep", infoEndereco.Cep);
            UtilBD.AdicionaParametro(ref _cmd, "@uf", infoEndereco.UF);
            UtilBD.AdicionaParametro(ref _cmd, "@complemento", infoEndereco.Complemento);
            
        }
        #endregion
    }
}
